SnowflakeとOktaを連携しSnowflakeへのSSOを試してみた #SnowflakeDB
さがらです。
SnowflakeとOktaを連携しSnowflakeへのSSOを試してみたので、その内容をまとめてみます。
やること
Okta上で事前にユーザーを1人作成しておき、SCIMやSAML2.0の設定を行い、SnowflakeにOkta経由でログインしてみます。
下記のドキュメントを参考に設定していきます。
検証環境
- Snowflake:AWS、Tokyoリージョン、Enterpriseエディション
- Okta:Okta Developerを使用
SnowflakeでのSCIM事前準備
まず、SnowflakeでOkta用のロールを構成していきます。こちらのドキュメントの内容に沿って各クエリを実行してみます。
use role accountadmin; create role if not exists okta_provisioner; grant create user on account to role okta_provisioner; grant create role on account to role okta_provisioner; grant role okta_provisioner to role accountadmin;
続いて、accountadmin
ロールを用いて以下のコマンドを実行しsecuriry integration
を作成します。
type = scim
とするsecurity integration
により、SnowflakeとサードパーティのIDプロバイダー(IdP)の間にインターフェイスを作成でき、ユーザーIDとロールの自動管理ができるようになります。
use role accountadmin; create or replace security integration okta_provisioning type = scim scim_client = 'okta' run_as_role = 'OKTA_PROVISIONER';
最後に、以下のクエリを実行してSCIM統合用の認証トークンを生成します。後でOktaから設定する際に使用するため、安全に保持しておきましょう。
select system$generate_scim_access_token('OKTA_PROVISIONING');
Oktaでのアプリケーション構築
続いて、Oktaでの設定を行っていきます。こちらはOktaのドキュメントも参考に進めていきます。
画面左のApplications
からBrowse App Catalog
を押します。
検索機能などを用いてSnowflake
を探しクリックします。
続けて、Add Integration
を押します。
Snowflakeアカウントの情報を入れていきます。
特に、Subdomain
については対象のSnowflakeアカウントの「アカウント識別子」を入力します。アカウント識別子についてはこちらのドキュメントをご覧ください。
私はAWS Tokyoリージョンで立てたトライアルアカウントで試したので、accountlocator..ap-northeast-1.aws
という形で入力しました。
※Browser plugin auto-submit
はデフォルトではチェックが入っているのですが、ここではスクショを撮るためにチェックを外しています。
すべて入力を終えたら、Next
を押します。
続いて、Sign-On Options
の設定画面に移ります。
まず、Sign on methods
の設定です。
SAML 2.0
にチェックを入れた上で、Disable Force Authentication
はチェックを外します。
Credentials Details
はデフォルト設定で進めてみます。右下のDone
を押します。
続いて、作成されたApplicationのProvisioning
タブから、Configure API Integration
を押します。
Enable API Integration
にチェックを入れ、API Token
には事前にSnowflake上で取得したトークンを入力します。入力後、Test API Credentials
を押して問題なければ、Save
を押します。
すると、ApplicationのProvisioning
タブに、To App
という欄が追加されます。To App
欄では、Oktaを介してSnowflake上の何をプロビジョニングするのか設定する画面が出てきます。
Provisioning to App
欄の右上のEdit
を押し、Create Users
などOktaの情報を用いてプロビジョニングして欲しい設定をEnable
にして、右下のSave
を押します。
続いて、同じくTo App
欄の末尾にAttribute Mappings
という項目を設定していきます。具体的には、defaultRole
とdefaultWarehouse
の属性がマッピングされていないため、これらをマッピングしていきます。
まず、Show Unmapped Attributes
を押します。
すると、Default Role
とDefault Warehouse
が表示されるため、これらのマッピングを行っていきます。
- すべてのユーザーに対して同じ値をマッピングする場合
- Okta上のProfileからマッピングする場合
SAML2.0を用いたフェデレーション認証の設定
続いて、SAML2.0を用いたフェデレーション認証の設定を行っていきます。
まず、Okta上で必要な情報を確認し、その後Snowflake上でSAML 2.0用のsecuriry integration
を作成し、フェデレーション認証を有効化していきます。
Oktaで設定したSnowflakeのApplication上のSign On
タブにおいて、SAML Signing Certificates
欄の横に、View SAML setup Instructions
があるので、これを押します。ここからOktaのドキュメントを開くことで、ドキュメント上で必要なパラメータを確認することが出来ます。
このドキュメントの6番に、Entity ID
、IDP SSO URL
、Authentication Certificate
、の3つの項目があるので、これらのパラメータを後でSnowflakeで実行する際に使用します。
これらのパラメータを確認した上でSnowflakeの画面に行き、以下のクエリを実行します。先程確認したパラメータに書き換えた上で、実行しましょう。
use role accountadmin; CREATE SECURITY INTEGRATION OKTAINTEGRATION TYPE = SAML2 ENABLED = TRUE SAML2_ISSUER = [the value from step 6 "Entity ID"] SAML2_SSO_URL = [the value from step 6 "IDP SSO URL"] SAML2_PROVIDER = OKTA SAML2_X509_CERT = [the value from step 6 "Authentication Certificate"] SAML2_SP_INITIATED_LOGIN_PAGE_LABEL = 'OKTA SSO' SAML2_ENABLE_SP_INITIATED = TRUE;
Okta上でGroupを作成しPush Groupsを行いSnowflake上のロールを自動作成する
次に、OktaのGroupをSnowflakeのロールとして設定可能なので、Groupを作成し、Push GroupsでSnowflake上にロールを作成していきます。
OktaでのGroup作成
Directory
➟Groups
から、Add Group
を押します。
Name
にSnowflake上で作成したいロール名と同じ名称を入力し、Save
を押します。
Groupを作成したら、作成したGroupを開いてPeople
欄から、Assign people
でユーザーを割り当てましょう。操作が完了したら右上のDone
を押さないと保存されないため注意してください。
Okta上で作成したGroupをPush Groupsする
続いて、Okta上の構築したSnowflakeアプリケーション上でPush Groupsします。これを行うことにより、Snowflake上にロールが自動作成されます。
Okta上で構築したSnowflakeアプリケーションの設定において、Push Groups
タブの+ Push Groups
を押します。
先程作成したGroupを入力し、選択します。
Okta上のGroupをSnowflake上のロールにどう割り当てるかの設定が出てきます、ここはデフォルトのCreate Group
のまま、Save
を押します。
このあと、対象のSnowflakeアカウント上で確認すると、OktaのGroup名に併せてロールが作られていました!
Okta上のユーザーには複数Groupをアサインすることができますが、すべてのGroupをPush Groupsすることで該当するロールがSnowflake上に作られます。後述のユーザーへのSnowflakeアプリケーションの割り当ても行っていると、対象ユーザーへのロールのGrantまで行ってくれます。
後述しますが、Oktaでロールを作成した後に各種権限を対象のロールにGrantしましょう!事前に自分で手動でロールを作ってしまうと、Oktaで上手くユーザーへの割当ができなくなってしまいます…
Okta上でユーザーをSnowflakeに割り当てる
最後に、Okta上のユーザーをSnowflakeに割り当てます。
Okta上のApplicationの画面からAssignments
タブをクリックし、Assign
を押します。(ここでは、Assign to People
で進めます。)
対象のユーザーに対してAssign
を押し、各属性に問題ないことを確認したら、Save and Go Back
を押します。
この後でSnowflake上でユーザーを確認すると、無事に作られていました!
Okta経由でSnowflakeにログインしてみる
これまでの設定でOkta経由でSnowflakeにログイン出来るようになったため、実際に試してみます!
まず、対象のSnowflakeアカウントのログインページを開くと、先程SAML 2.0用のsecurity integration
を構築する際のSAML2_SP_INITIATED_LOGIN_PAGE_LABEL
で指定した文字列OKTA SSO
と合わせて「OKTA SSOを使用してサインイン」というボタンが表示されています。これを押してみます。
こちらを押すとOktaにログインしていない場合はOktaへのサインインの画面が出てきます。必要な情報を入力し、サインインを押します。
すると、無事にログインできました!事前にSnowflake上でユーザーとロールを作っていなくても、Oktaを介してユーザーとロールを作成し、デフォルトロールも切り替えることが出来ました。
検証時に詰まったところ
本検証を通して、「SCIMの設定をしているのにロールが自動的にユーザーに付与されない」という問題がありました。
この原因として、SCIMを介してロールを付与する場合にはいくつか注意点があります。
- Oktaを介さずにユーザーが作成したロールは、そのロールの所有権をOktaのSCIM用途のロールに譲渡してもOkta経由で付与することが出来ない
- つまり、SYSADMINなどのデフォルトで存在するシステムロールはOkta経由で付与できない上、その他にOkta連携前にユーザーが作成したロールもOkta経由で付与できない
- 公式Docにも「Known Issues」として記載があります。
- Okta上でGroupを作成して、Okta上のSnowflakeアプリケーションでPush Groupsをしないと、対象のSnowflake上にロールは作られない
- Oktaを触るのが初めての自分はここでだいぶ躓きました…
※こちらの件はSnowflakeサポートの方に助けて頂きました…いつもありがとうございます!!
最後に
SnowflakeとOktaを連携しSnowflakeへのSSOを試してみました。
実際に試してみて、ユーザーだけでなくロールの作成まで自動で行ってくれるのは本当に便利だなと感じました!OktaとSnowflakeを連携させるケースは多いと思いますので、少しでも参考になると幸いです。